use axum::{
    response::IntoResponse,
    extract::State,
    http::{Request, StatusCode},
    middleware::Next,
    body::Body, // 引入 axum 的默认请求体类型
};
use headers::authorization::{Authorization, Basic};
use headers::HeaderMapExt;
use crate::AppState;
use std::sync::Arc;
use axum::{
    response::Response,
};
// 显式标注请求体类型为 Body（axum 的默认请求体类型）
pub async fn basic(
    State(state): State<Arc<AppState>>,
    request: Request<Body>, // 这里将 B 改为具体的 Body 类型
    next: Next, // 同时标注 Next 的请求体类型为 Body
) -> Response {
    // 提取 Basic 认证信息
    if let Some(credential) = request.headers().typed_get::<Authorization<Basic>>() {
        // 验证用户名密码（注意：实际项目中建议避免直接比较字符串，可使用密码哈希）
        if state.http_auth_username == credential.0.username()
            && state.http_auth_password == credential.0.password()
        {
            // 认证通过，继续处理请求
            return next.run(request).await;
        }
    }

    // 认证失败，返回 401
    let mut res = (StatusCode::UNAUTHORIZED, "Authorization is required").into_response();
    res.headers_mut().insert(
        "WWW-Authenticate",
        "Basic realm=\"Mailtutan\"".parse().unwrap(),
    );
    res
}